#define MCU_GPIO_IMPLEMENTATION

#include "includes.h"

/****************************************************
 函数名称: mcu_led_init
 函数作用: led初始化函数
 函数参数: 无
 返回值: 无
****************************************************/
void mcu_led_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    /* PB5 LED0 RED */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* PE5 LED1 GREEN */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);

    // 设置LED灯为关闭状态
    GPIO_SetBits(GPIOB, GPIO_Pin_5);
    GPIO_SetBits(GPIOE, GPIO_Pin_5);
}

/****************************************************
 函数名称: mcu_led_on
 函数作用: led打开函数
 函数参数: 无
 返回值: 无
****************************************************/  
void mcu_led_on(void)
{
    GPIO_SetBits(GPIOB, GPIO_Pin_5);
    GPIO_SetBits(GPIOE, GPIO_Pin_5);
}

/****************************************************
 函数名称: mcu_led_off
 函数作用: led关闭函数
 函数参数: 无
 返回值: 无
****************************************************/
void mcu_led_off(void)
{
    GPIO_ResetBits(GPIOB, GPIO_Pin_5);
    GPIO_ResetBits(GPIOE, GPIO_Pin_5);
}

/****************************************************
 函数名称: mcu_led_toggle
 函数作用: led翻转函数
 函数参数: 无
 返回值: 无
****************************************************/
void mcu_led_toggle(void)
{
    GPIOB->ODR ^= GPIO_Pin_5;
    GPIOE->ODR ^= GPIO_Pin_5;
}

/****************************************************
 函数名称: mcu_led_red_on
 函数作用: 红灯打开函数
 函数参数: 无
 返回值: 无
****************************************************/  
void mcu_led_red_on(void)
{
    GPIO_SetBits(GPIOB, GPIO_Pin_5);
}

/****************************************************
 函数名称: mcu_led_red_off
 函数作用: 红灯关闭函数
 函数参数: 无
 返回值: 无
****************************************************/
void mcu_led_red_off(void)
{
    GPIO_ResetBits(GPIOB, GPIO_Pin_5);
}

/****************************************************
 函数名称: mcu_led_red_toggle
 函数作用: 红灯翻转函数
 函数参数: 无
 返回值: 无
****************************************************/
void mcu_led_red_toggle(void)
{
    GPIOB->ODR ^= GPIO_Pin_5;
}

/****************************************************
 函数名称: mcu_led_green_on
 函数作用: 绿灯打开函数
 函数参数: 无
 返回值: 无
****************************************************/
void mcu_led_green_on(void)
{
    GPIO_SetBits(GPIOE, GPIO_Pin_5);
}

/****************************************************
 函数名称: mcu_led_green_off
 函数作用: 绿灯关闭函数
 函数参数: 无
 返回值: 无
****************************************************/
void mcu_led_green_off(void)
{
    GPIO_ResetBits(GPIOE, GPIO_Pin_5);
}

/****************************************************
 函数名称: mcu_led_green_toggle
 函数作用: 绿灯翻转函数
 函数参数: 无
 返回值: 无
****************************************************/
void mcu_led_green_toggle(void)
{
    GPIOE->ODR ^= GPIO_Pin_5;
}


/****************************************************
 函数名称: mcu_iic_init
 函数作用: MCU IIC初始化函数
 函数参数: 无
 返回值: 无
****************************************************/
void mcu_iic_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    // 配置SCLHE和SDA引脚
    GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_6;       // SCL
    GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_7;       // SDA
    GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_Out_OD;
    GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    // 设置SCL和SDA为高电平
    GPIO_SetBits(GPIOB, GPIO_Pin_6);
    GPIO_SetBits(GPIOB, GPIO_Pin_7);
}

/****************************************************
 函数名称: mcu_iic_set_scl
 函数作用: 置位SCL函数
 函数参数: 无
 返回值: 无
****************************************************/
void mcu_iic_set_scl(void)
{
    // SCL置位
    GPIO_SetBits(GPIOB, GPIO_Pin_6);
}

/****************************************************
 函数名称: mcu_iic_clr_scl
 函数作用: 清零SCL函数
 函数参数: 无
 返回值: 无
****************************************************/
void mcu_iic_clr_scl(void)
{
    // SCL清零
    GPIO_ResetBits(GPIOB, GPIO_Pin_6);
}

/****************************************************
 函数名称: mcu_iic_set_sda
 函数作用: 置位SDA函数
 函数参数: 无
 返回值: 无
****************************************************/
void mcu_iic_set_sda(void)
{
    // SDA置位
    GPIO_SetBits(GPIOB, GPIO_Pin_7);
}

/****************************************************
 函数名称: mcu_iic_clr_sda
 函数作用: 清零SDA函数
 函数参数: 无
 返回值: 无
****************************************************/
void mcu_iic_clr_sda(void)
{
    // SDA清零
    GPIO_ResetBits(GPIOB, GPIO_Pin_7);
}

/****************************************************
 函数名称: mcu_iic_get_sda
 函数作用: 获取SDA电平
 函数参数: 无
 返回值: 无
 ****************************************************/
void mcu_iic_get_sda(void)
{
    // 获取SDA电平
    GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7);
}

/****************************************************
 函数名称: mcu_iic_config_sda_output
 函数作用: 配置SDA输出函数
 函数参数: 无
 返回值: 无
 ****************************************************/
void mcu_iic_config_sda_output(void)
{
    // 配置SDA输出
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_Out_OD; // 开漏输出
    GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}

/****************************************************
 函数名称: mcu_iic_config_sda_input
 函数作用: MCU配置SDA输入函数
 函数参数: 无
 返回值: 无
 ****************************************************/
void mcu_iic_config_sda_input(void)
{
    // 配置SDA输入
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_IPU; // 上拉输入
    GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}


/****************************************************
 函数名称: mcu_gpio_init
 函数作用: GPIO初始化函数
 函数参数: 无
 返回值: 无
****************************************************/
void mcu_gpio_init(void)
{
    // LED引脚配置
    mcu_led_init();

    // IIC引脚配置
    mcu_iic_init();
}
